package camadaSO;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.ServerNotActiveException;
import java.rmi.server.UnicastRemoteObject;

import camadaRN.RNEliteSquadServer;
import camadaRN.RNUsuarioServer;

public class ServidorRMI extends UnicastRemoteObject implements IClienteServidorRMI {
	
	public ServidorRMI() throws RemoteException {	
	}
	
	public boolean iniciarServidorRMI() {
        try {
            LocateRegistry.createRegistry(1099);
            ServidorRMI obj = new ServidorRMI();
            Naming.rebind("//localhost//Servidor",obj);
            return true;
        } catch (MalformedURLException ex) {
        	System.out.println();
			System.out.println( "MalformedURLException: " + ex.toString() );
        } catch (RemoteException ex) {
        	System.out.println();
			System.out.println( "RemoteException: " + ex.toString() ); 
        }
        return false;
    }
	
	 public boolean finalizarServidorRMI() {
	        try {
	            Naming.unbind("//localhost//Servidor");
	            return true;
	        } catch (RemoteException ex) {
	        	System.out.println();
				System.out.println( "RemoteException: " + ex.toString() ); 
	        } catch (NotBoundException ex) {
	        	System.out.println();
				System.out.println( "NotBoundException: " + ex.toString() );
	        } catch (MalformedURLException ex) {
	        	System.out.println();
				System.out.println( "MalformedURLException: " + ex.toString() );
	        }
	        return false;
	    }

	public boolean cadastrarUsuario(String nome, String senha) throws RemoteException{
		return camadaRN.RNEliteSquadServer.getRNServer().cadastrarUsuario(nome, senha);
	}
 
	public boolean logarUsuario(String nome, String senha) throws java.rmi.RemoteException{
		String ipUsuario="";
		try {
			ipUsuario = getClientHost();
		} catch (ServerNotActiveException e) {
			e.printStackTrace();
		}
		return camadaRN.RNEliteSquadServer.getRNServer().logarUsuario(nome, senha,ipUsuario);
	}

	public void pedirParaAtualizarLista() {
		camadaRN.RNEliteSquadServer.getRNServer().passaListaPClientes();
	}	

	public void desafiarOponente(String desafiante, String desafiado) throws RemoteException {
		camadaRN.RNEliteSquadServer.getRNServer().getUsuariobyNome(desafiado).encaminhaDesafio(desafiante);		
	}

	public void responderDesafio(boolean resposta, String desafiante,String desafiado) throws RemoteException {
		camadaRN.RNEliteSquadServer.getRNServer().
			getUsuariobyNome(desafiante).encaminhaRespostaDesafio(resposta,desafiado);
	}

	public void atualizarTabuleiroRemoto(String usuario,int xpeca1, int ypeca1, int xpeca2,int ypeca2) throws RemoteException {
		RNUsuarioServer jogador = camadaRN.RNEliteSquadServer.getRNServer().getUsuariobyNome(usuario);
		jogador.getPartidaCorrente().reposicionaPecas(xpeca1, ypeca1,  xpeca2,ypeca2, jogador);
		
	}

	public void realizarCombate(String usuario, int xpeca1, int ypeca1, int xpeca2, int ypeca2) throws RemoteException {
		RNUsuarioServer jogador = camadaRN.RNEliteSquadServer.getRNServer().getUsuariobyNome(usuario);
		jogador.getPartidaCorrente().decideVencedor(xpeca1, ypeca1, xpeca2, ypeca2, jogador);
	}
	
	public void atualizarTelaAdversario(String usuario, int posicaoY,	int posicaoX, int posicaoY2, int posicaoX2)throws java.rmi.RemoteException{
		RNUsuarioServer jogador = camadaRN.RNEliteSquadServer.getRNServer().getUsuariobyNome(usuario);
		IServidorClienteRMI cliente = jogador.getPartidaCorrente().getAdversario(jogador);
		cliente.atualizaTela(posicaoY,posicaoX,posicaoY2,posicaoX2);
	}

	public void gravarPecasRemoto( String usuario, int[][] forcas) throws java.rmi.RemoteException{		
		RNUsuarioServer jogador = camadaRN.RNEliteSquadServer.getRNServer().getUsuariobyNome(usuario);
		jogador.getPartidaCorrente().posicionaPecas(jogador,forcas);		
	}

	public void enviarNovoStatus(String usuario, boolean novoStatus)throws RemoteException {
		camadaRN.RNEliteSquadServer.getRNServer().getUsuariobyNome(usuario).setStatus(novoStatus);
		camadaRN.RNEliteSquadServer.getRNServer().passaListaPClientes();
	}

	public void verificaJogoPronto(String usuario) throws RemoteException {		
		RNUsuarioServer jogador = camadaRN.RNEliteSquadServer.getRNServer().getUsuariobyNome(usuario);
		jogador.getPartidaCorrente().setPodeComecar(jogador.getPartidaCorrente().getPodeComecar()+1);
	}

	public void desistirPartida(String usuario) throws RemoteException {
		RNUsuarioServer jogador = camadaRN.RNEliteSquadServer.getRNServer().getUsuariobyNome(usuario);
		jogador.getPartidaCorrente().finalizarPartida(jogador);
	}

	public void finalizarCliente(String usuario) throws RemoteException {		
		RNUsuarioServer jogador = camadaRN.RNEliteSquadServer.getRNServer().getUsuariobyNome(usuario);	
		RNEliteSquadServer.getRNServer().deslogaUsuario(jogador);
	}	
}
